﻿#include <iostream>
//条款10：令operator=返回一个指向*this的引用

//赋值的一个有趣之处在于，可以将他们串起来：
int a, b, c;
// a = b = c = 10; //b和c的值相同，a的值与b相同
// a = ( b = (c = 10));

//自定义的类，实现赋值操作符时应该遵循这个约定
class Widget
{
public:
    Widget(int cnt) : data(cnt){} //允许派生类使用默认构造函数
    Widget& operator=(const Widget& w) //允许派生类使用赋值运算符
    {
        if (this != &w) //防止自赋值
        {
            //执行赋值操作
        }
        this->data = w.data; //将w的值赋给this
        return *this; //返回一个指向*this的引用
    }
    Widget& operator+=(const Widget& w) //允许派生类使用赋值运算符
    {
        this->data += w.data;
        return *this; //返回一个指向*this的引用
    }
    Widget& operator++() //允许派生类使用赋值运算符
    {
        this->data ++;
        return *this; //返回一个指向*this的引用
    }
    Widget& operator++(int) //允许派生类使用赋值运算符
    {
        this->data ++;
        return *this; //返回一个指向*this的引用
    }
    Widget& operator=(int rhs) //允许派生类使用赋值运算符
    {
        this->data = rhs;
        return *this; //返回一个指向*this的引用
    }
    int GetData() const
    {
        return data;
    }
private:
    int data;
};
void item10()
{
    a = b = c = 10; //b和c的值相同，a的值与b相同
    Widget w1(10), w2(20), w3(30);

    ++(w1 = w2 += w3 = 30)++;

    std::cout << "w1 =" << w1.GetData() << std::endl;
    std::cout << "w2 =" << w2.GetData() << std::endl;
    std::cout << "w3 =" << w3.GetData() << std::endl;
}
//让赋值运算符返回*this的引用。